/**
 * 管理员用户模型
 * 定义管理员用户的数据结构和方法
 */

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

/**
 * 管理员用户Schema
 */
const adminUserSchema = new mongoose.Schema({
    /**
     * 管理员用户名
     */
    username: {
        type: String,
        required: true,
        unique: true,
        trim: true,
        minlength: 3,
        maxlength: 50
    },
    
    /**
     * 管理员密码（加密存储）
     */
    password: {
        type: String,
        required: true
    },
    
    /**
     * 管理员角色
     */
    role: {
        type: String,
        enum: ['superadmin', 'admin', 'editor'],
        default: 'admin'
    },
    
    /**
     * 管理员状态
     */
    status: {
        type: String,
        enum: ['active', 'inactive', 'locked'],
        default: 'active'
    },
    
    /**
     * 最后登录时间
     */
    lastLogin: {
        type: Date
    },
    
    /**
     * 创建时间
     */
    createdAt: {
        type: Date,
        default: Date.now
    },
    
    /**
     * 更新时间
     */
    updatedAt: {
        type: Date,
        default: Date.now
    }
}, {
    timestamps: true
});

/**
 * 密码加密中间件
 */
adminUserSchema.pre('save', async function(next) {
    if (!this.isModified('password')) {
        return next();
    }
    
    try {
        // 生成盐值并加密密码
        const salt = await bcrypt.genSalt(12);
        this.password = await bcrypt.hash(this.password, salt);
        next();
    } catch (error) {
        next(error);
    }
});

/**
 * 验证密码方法
 */
adminUserSchema.methods.validatePassword = async function(password) {
    return await bcrypt.compare(password, this.password);
};

/**
 * 更新最后登录时间方法
 */
adminUserSchema.methods.updateLastLogin = async function() {
    this.lastLogin = new Date();
    await this.save();
};

/**
 * 管理员用户模型
 */
const AdminUser = mongoose.model('AdminUser', adminUserSchema);

module.exports = AdminUser;